#include <iostream>
using namespace std; 

class Derived;

class Base
{
public:
	Base()
	{
		
	}
	Base(Base& x)
	{
		cout << &x << endl;
		cout << "!" << endl;
	}
	
	operator Derived&()
	{
		//Derived* p = static_cast<Derived*>(this);
		Base b1;
		Base* pb1 = &b1;
		Derived* pd = static_cast<Derived*>(pb1);
		cout << "$" << endl;
		return *pd;
	}
};

class Derived: public Base
{
public:
	Derived()
	{
		
	}
	Derived(Base& x)
	: Base(x)
	{
		cout << "@" << endl;
	}
	
};

int main()
{
//	Derived d1;
//	//cout << &d1 << endl;
//	Base b1(d1);
//	
//	//Derived d2(b1);
//	
//	Derived& qd3 = b1;
	Base* pB = new Base();
	if (Derived* pD = static_cast<Derived*>(pB))
	{
	}//下行转换是不安全的(坚决抵制这种方法)
	
	Derived* pD = new Derived();
	if (Base* pB = static_cast<Base*>(pD))
	{
	}//上行转换是安全的
	
	return 0;
}
















//class Object
//{
//	int _id;
//public:
//	Object(int id=0):_id(id)
//	{ 
//		cout << this << " " << "C "<<_id<<endl;
//	}
//	
//	Object(const Object &r)
//	:_id(r._id)
//	{ 
//		cout << this << " "<< "M "<<_id<<endl; 
//	}
//	
//	~Object() 
//	{
//		cout<< this << " "<< "D "<<_id<<endl;
//	}
//};
//
//
//
//
//Object* func(Object &a, Object b)
//{
//	cout << "1" << endl;
//	static Object s=a;
//	return &s;
//}
//
//int main()
//{
//	Object a(1), b;
//	static Object s=a;
//	//Object &c(*func(a, b));
//	return 0;
//}
